package com.hwd.gmall.seckill.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 日期工具类
 *
 * @author 黄伟东/Victor
 * @date 2022/05/11 16:04
 */
public class DateUtil {

    /** 一天5场秒杀活动 */
    private static final int ROUND = 5;

    /** 时间格式:2022051116 */
    public static final String PATTERN_YYYYMMDDHH = "yyyyMMddHH";

    /** 时间格式:2022-05-11 16:00 */
    public static final String PATTERN_YYYY_MM_DDHHMM = "yyyy-MM-dd HH:mm";

    /**
     * 从yyyy-MM-dd HH:mm格式转成yyyyMMddHH格式
     *
     * @param dateStr    时间字符串
     * @param oldPattern 旧的时间格式
     * @param newPattern 新的时间格式
     * @return java.lang.String 返回新的时间格式
     */
    public static String formatStr(String dateStr, String oldPattern, String newPattern) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(oldPattern);
        try {
            Date date = simpleDateFormat.parse(dateStr);
            simpleDateFormat = new SimpleDateFormat(newPattern);
            return simpleDateFormat.format(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取指定日期的凌晨
     *
     * @param date 指定日期
     * @return java.util.Date
     */
    public static Date toDayStartHour(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }


    /**
     * 时间增加N分钟
     *
     * @param date    指定时间
     * @param minutes 增加的时间，单位:分钟
     * @return java.util.Date
     */
    public static Date addDateMinutes(Date date, int minutes) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 24小时制
        calendar.add(Calendar.MINUTE, minutes);
        date = calendar.getTime();
        return date;
    }

    /**
     * 时间递增N小时
     *
     * @param date 指定时间
     * @param hour 增加的时间，单位:小时
     * @return java.util.Date
     */
    public static Date addDateHour(Date date, int hour) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 24小时制
        calendar.add(Calendar.HOUR, hour);
        date = calendar.getTime();
        return date;
    }

    /**
     * 获取菜单时间
     *
     * @return java.util.List<java.util.Date>
     */
    public static List<Date> getDateMenus() {
        // 定义一个List<Date>集合，存储所有时间段
        List<Date> dates = getDates(12);
        // 判断当前时间属于哪个时间范围
        Date now = new Date();
        for (Date currentDate : dates) {
            // 开始时间 <= 当前时间 < 开始时间+2小时
            if (currentDate.getTime() <= now.getTime() && now.getTime() < addDateHour(currentDate, 2).getTime()) {
                now = currentDate;
                break;
            }
        }

        // 当前需要显示的时间菜单
        List<Date> dateMenus = new ArrayList<>();
        for (int i = 0; i < ROUND; i++) {
            dateMenus.add(addDateHour(now, i * 2));
        }

        return dateMenus;
    }

    /**
     * 指定时间往后N个时间间隔
     *
     * @param hours 时间间隔，单位:小时
     * @return java.util.List<java.util.Date>
     */
    public static List<Date> getDates(int hours) {
        List<Date> dates = new ArrayList<>();
        // 获取当前日期的凌晨时间，循环12次
        Date date = toDayStartHour(new Date());
        for (int i = 0; i < hours; i++) {
            // 每次递增2小时，将每次递增的时间存入到List<Date>集合中
            dates.add(addDateHour(date, i * 2));
        }
        return dates;
    }

    /**
     * 时间转成yyyyMMddHH
     *
     * @param date    指定时间
     * @param pattern 时间格式
     * @return java.lang.String
     */
    public static String data2str(Date date, String pattern) {
        return new SimpleDateFormat(pattern).format(date);
    }
}
